/**
 * 认证工具类
 * 用于处理用户身份验证和认证状态管理
 */

import { showToast, showFailToast } from 'vant'

// Token存储的键名
const TOKEN_KEY = 'token'
const USER_INFO_KEY = 'userInfo'

// Token过期时间检查
// JWT的payload部分解码函数
const parseJwt = (token) => {
  try {
    const base64Url = token.split('.')[1]
    const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/')
    const jsonPayload = decodeURIComponent(
      atob(base64).split('').map(c => {
        return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)
      }).join('')
    )
    return JSON.parse(jsonPayload)
  } catch (e) {
    console.error('解析JWT Token失败', e)
    return null
  }
}

/**
 * 设置认证Token
 * @param {string} token JWT token
 */
export function setToken(token) {
  localStorage.setItem(TOKEN_KEY, token)
}

/**
 * 获取认证Token
 * @returns {string|null} JWT token
 */
export function getToken() {
  return localStorage.getItem(TOKEN_KEY)
}

/**
 * 删除认证Token
 */
export function removeToken() {
  localStorage.removeItem(TOKEN_KEY)
}

/**
 * 设置用户信息
 * @param {Object} userInfo 用户信息对象
 */
export function setUserInfo(userInfo) {
  localStorage.setItem(USER_INFO_KEY, JSON.stringify(userInfo))
}

/**
 * 获取用户信息
 * @returns {Object|null} 用户信息
 */
export function getUserInfo() {
  const userInfoStr = localStorage.getItem(USER_INFO_KEY)
  return userInfoStr ? JSON.parse(userInfoStr) : null
}

/**
 * 删除用户信息
 */
export function removeUserInfo() {
  localStorage.removeItem(USER_INFO_KEY)
}

/**
 * 验证用户是否已登录
 * @returns {boolean} 是否已登录
 */
export function isAuthenticated() {
  const token = getToken()
  if (!token) return false
  
  // 检查token是否过期
  try {
    const payload = parseJwt(token)
    if (!payload || !payload.exp) return false
    
    // 判断是否过期 (exp是UNIX时间戳，以秒为单位)
    const now = Math.floor(Date.now() / 1000)
    return payload.exp > now
  } catch (e) {
    console.error('验证Token失败', e)
    return false
  }
}

/**
 * 检查用户是否有指定角色
 * @param {string} requiredRole 所需角色
 * @returns {boolean} 是否有权限
 */
export function hasRole(requiredRole) {
  const userInfo = getUserInfo()
  return userInfo && userInfo.role === requiredRole
}

/**
 * 登出并重定向到登录页
 * @param {string} message 提示消息
 * @param {Object} router Vue路由器实例
 */
export function logout(message, router) {
  // 清除token和用户信息
  removeToken()
  removeUserInfo()
  
  // 如果在浏览器环境中，尝试重置Pinia store
  if (typeof window !== 'undefined') {
    try {
      // 动态导入避免服务端渲染问题
      import('../stores/userStore').then(({ useUserStore }) => {
        const userStore = useUserStore()
        // 重置用户store
        userStore.resetStore()
      }).catch(err => {
        console.error('重置用户store失败:', err)
      })
    } catch (e) {
      console.error('重置用户store错误:', e)
    }
  }
  
  if (message) {
    showToast({
      message: message,
      type: 'warning'
    })
  }
  
  // 如果提供了router，则进行导航
  if (router) {
    // 重定向到登录页，并携带当前路径用于登录后跳回
    const currentPath = router.currentRoute.value.fullPath
    router.replace({
      path: '/login',
      query: currentPath !== '/login' ? { redirect: currentPath } : undefined
    })
  } else {
    // 否则直接刷新页面或跳转
    window.location.href = '/login'
  }
}

/**
 * 校验路由权限
 * @param {Object} to 目标路由
 * @returns {boolean|Object} true表示允许访问，否则返回重定向对象
 */
export function validateRouteAccess(to) {
  // 如果路由不需要认证，直接放行
  if (!to.meta.requiresAuth) {
    return true
  }
  
  // 检查用户是否登录
  if (!isAuthenticated()) {
    return {
      path: '/login',
      query: { redirect: to.fullPath }
    }
  }
  
  // 检查是否需要管理员权限
  if (to.meta.requiresAdmin && !hasRole('admin')) {
    showToast({
      message: '您没有访问该页面的权限',
      type: 'warning'
    })
    return { path: '/' }
  }
  
  return true
}

/**
 * 全局身份验证初始化
 * 用于应用启动时检查身份验证状态
 * @param {Object} router Vue路由器实例
 */
export function initAuth(router) {
  // 检查token是否有效
  if (getToken() && !isAuthenticated()) {
    logout('登录已过期，请重新登录', router)
  }
} 